﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Text;
using System.Linq;
using Sinacor.UI.Bovespa.Ordens;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.Common.Validation;
using Sinacor.UI.Bovespa.Ordens.Communication.Bovespa.Calendario.Calendario;

namespace Sinacor.UI.Bovespa.Ordens.Presenter
{
    public class CancelamentoDistribuicaoPresenter : BasePresenter<ICancelamentoDistribuicao>
    {
        #region Atributos

        private ICancelamentoDistribuicao _view;
        private ModelCollection<Model.Calendario> _ListCalendario;
        private ModelCollection<Model.Cliente> _ListCliente;
        private ModelCollection<Model.Operador> _ListOperador;
        private ModelCollection<Model.OrdemDistribuicao> _ListOrdem;
        private Sinacor.UI.Bovespa.Ordens.Communication.Ordem _comunicacaoOrdem;

        #endregion

        #region Propriedades

     

        public ModelCollection<Model.Calendario> ListCalendario
        {
            get
            {
                return this._ListCalendario;
            }

            set
            {
                this._ListCalendario = value;

                if (this._ListCalendario != null) 
                    this.ListCalendario.EnableStateControl = true;
            }
        }

        public ModelCollection<Model.Cliente> ListCliente
        {
            get
            {
                return this._ListCliente;
            }

            set
            {
                this._ListCliente = value;

                if (this._ListCliente != null)
                    this.ListCliente.EnableStateControl = true;
            }
        }

        public ModelCollection<Model.Operador> ListOperador
        {
            get
            {
                return this._ListOperador;
            }

            set
            {
                this._ListOperador = value;

                if(this._ListOperador != null)
                    this.ListOperador.EnableStateControl = true;
            }
        }

        public ModelCollection<Model.OrdemDistribuicao> ListOrdem
        {
            get
            {
                return this._ListOrdem;
            }

            set
            {
                this._ListOrdem = value;
            }
        }

        #endregion

        #region Construtores

        public CancelamentoDistribuicaoPresenter(ICancelamentoDistribuicao view)
            : base(view)
        {
            this._view = view;
            this._ListCalendario = new ModelCollection<Sinacor.UI.Bovespa.Ordens.Model.Calendario>();
            this._ListCliente = new ModelCollection<Sinacor.UI.Bovespa.Ordens.Model.Cliente>();
            this._ListOperador = new ModelCollection<Sinacor.UI.Bovespa.Ordens.Model.Operador>();
            this._ListOrdem = new ModelCollection<Sinacor.UI.Bovespa.Ordens.Model.OrdemDistribuicao>();
        }

        #endregion

        #region Métodos

        public void CancelarOrdemDistribuida(ModelCollection<Model.OrdemDistribuida> pCancelar)
        {
            bool achouErro = false;
            ModelCollection<Model.OrdemDistribuidaResultado> ordensResultado = null;
            Model.OrdemDistribuicao itemManipulado;

            try
            {
                View.IniciarProcesso();
                ordensResultado = (new Sinacor.UI.Bovespa.Ordens.Communication.Ordem(this.Session)).CancelarOrdensDistribuidas(pCancelar);

                foreach (Model.OrdemDistribuidaResultado itemResultado in ordensResultado)
                {
                    itemManipulado = this.ListOrdem.SingleOrDefault<Model.OrdemDistribuicao>(delegate(Model.OrdemDistribuicao analisar)
                                                        {
                                                            return analisar.Identificador == itemResultado.Identificador;
                                                        });

                    if (itemManipulado != null)
                    {
                        if (itemResultado.Sucesso)
                        {
                            this.ListOrdem.Remove(itemManipulado);
                        }
                        else
                        {
                            if (!achouErro)
                                achouErro = true;

                            itemManipulado.AddError(itemResultado.Erro);
                        }
                    }
                }

                View.ApresentarOrdem(this.ListOrdem);

                if (!achouErro)
                {
                    View.InformarCancelamentoEfetuado();
                }
                else
                {
                    View.InformarCancelamentoEfetuadoErros();
                }
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }

        public Model.Cliente ConsultarClienteApelido(Model.Parameter.ConsultarClienteApelidoRequest pConsultarClienteApelido)
        {
            Model.Cliente retornoCliente = null;

            try
            {
                View.IniciarProcesso();
                retornoCliente = new Sinacor.UI.Bovespa.Ordens.Communication.Cliente(this.Session).ConsultarClienteApelido(pConsultarClienteApelido);

            }
            catch (Exception ex)
            {
                View.LimparCliente();
                base.HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();  
            }

            return retornoCliente;
        }

        public void CarregarCalendario()
        {
            ModelCollection<Model.Calendario> retorno = null;
            Model.Calendario itemCalendario = null;

            try
            {
                retorno = (new Sinacor.UI.Bovespa.Ordens.Communication.Calendario(this.Session)).ConsultarCalendario();

                for (int x = 0; x < retorno.Count; x++)
                {
                    itemCalendario = new Sinacor.UI.Bovespa.Ordens.Model.Calendario();
                    itemCalendario.DataPregao = Convert.ToDateTime(retorno[x].DataPregao.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern));
                    ListCalendario.Add(itemCalendario);
                }

                this._view.ApresentarCalendario();


            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        }

        public void CarregarOperador()
        {
            try
            {
                this._ListOperador = (new Sinacor.UI.Bovespa.Ordens.Communication.Operador(this.Session)).ConsultarOperador();

                this._view.ApresentarOperador();


            }
            catch (Exception ex)
            {
                base.HandleException(ex);
            }
        }

        public void VerificarPermissaoCancelamento()
        {

            Sinacor.UI.Bovespa.Ordens.Model.Parameter.VerificarAcessoFuncaoRequest pAcessoFuncao = new Sinacor.UI.Bovespa.Ordens.Model.Parameter.VerificarAcessoFuncaoRequest();
            pAcessoFuncao.Funcao = "EORD";

            try
            {
                if (!(new Sinacor.UI.Bovespa.Ordens.Communication.Acesso(this.Session)).VerificarAcesso(pAcessoFuncao))
                {
                    View.DesabilitarCancelamento();
                }
                else
                {
                    View.HabilitarCancelamento();
                }                
            }
            catch (Exception ex)
            {   
                HandleException(ex);                
            }
        }

        public void CarregarTelaInicial()
        {
            try
            {
                View.IniciarProcesso();
                this.CarregarCalendario();
                this.CarregarOperador();
                this.VerificarPermissaoCancelamento();
            }
            catch (Exception ex)
            {
                View.FinalizarProcesso();
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }

        public void ValidarFilhote(Model.Parameter.ValidarFilhoteRequest pValidarFilhote)
        {
            try
            {
                View.IniciarProcesso();

                new Sinacor.UI.Bovespa.Ordens.Communication.Cliente(this.Session).ValidarFilhote(pValidarFilhote);

            }
            catch (Exception ex)
            {
                View.LimparFilhote();
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }


        }

        public void ConsultarOrdem(Model.ModelCancelamentoDistribuicao modelCancelamento)
        {

            Model.Parameter.ConsultarOrdemDistribuidaRequest pConsultarOrdem = null;


            try
            {
                View.IniciarProcesso();
                pConsultarOrdem = new Sinacor.UI.Bovespa.Ordens.Model.Parameter.ConsultarOrdemDistribuidaRequest();
                
                if (modelCancelamento.Apelido != null)
                pConsultarOrdem.ApelidoCliente = (modelCancelamento.Apelido.Trim() != "") ? modelCancelamento.Apelido: null;

                if (modelCancelamento.Filhote != null)
                pConsultarOrdem.ApelidoFilhote = (modelCancelamento.Filhote.Trim() != "") ? modelCancelamento.Filhote: null;

                pConsultarOrdem.DataPregao = modelCancelamento.Pregao;
                pConsultarOrdem.CodigoUsuario = modelCancelamento.CodigoOperador;
                this.ListOrdem.Clear();
                this.ListOrdem = new Sinacor.UI.Bovespa.Ordens.Communication.Ordem(this.Session).ConsultarOrdemDistribuida(pConsultarOrdem);

                if (this.ListOrdem.Count > 0)
                {
                    foreach (Model.OrdemDistribuicao item in this.ListOrdem)
                    {
                        item.Identificador = Guid.NewGuid();
                    }

                    View.ApresentarOrdem(this._ListOrdem);
                }
                else
                {
                    View.InformarMensagemSemResultado();
                }

            }
            catch (Exception ex)
            {
                HandleException(ex);
            }
            finally
            {
                View.FinalizarProcesso();
            }
        }

        public void VerificarStatusOrdemDistribuicao(Model.OrdemDistribuicao itemOrdemDistribuicao)
        {
            if (itemOrdemDistribuicao.PercentualDistribuido == null || itemOrdemDistribuicao.PercentualDistribuido == 0)
            {
                if (itemOrdemDistribuicao.QuantidadeCasada != itemOrdemDistribuicao.QuantidadeDistribuida)
                {
                    View.ApresentarDistribuidaParcial();
                }
                else
                {
                    View.ApresentarDistribuidaTotal();
                }
            }
            else if (itemOrdemDistribuicao.PercentualDistribuido < 100)
            {
                View.ApresentarDistribuidaParcial();
            }
            else
            {
                View.ApresentarDistribuidaTotal();
            }
        }

        #endregion
    }
}
